gusucode.com > VC++ 基于IE内核功能很齐全的浏览器(支持多标签)-源码程序 > VC++ 基于IE内核功能很齐全的浏览器(支持多标签)-源码程序/code/Explorer/AutoEnumString.cpp
//Download by http://www.NewXing.com // AutoEnumString.cpp: implementation of the CAutoEnumString class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "AutoEnumString.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CAutoEnumString::CAutoEnumString() { m_Ref = 0; m_iterCur = 0; } CAutoEnumString::~CAutoEnumString() { } int CAutoEnumString::AddString(LPCSTR lpszStr) { return m_arString.Add(lpszStr); } ULONG CAutoEnumString::AddRef() { m_Ref ++; return (ULONG) m_Ref; } ULONG CAutoEnumString::Release() { m_Ref --; if (m_Ref == 0 ) { delete this; return 0; } return (ULONG) m_Ref; } HRESULT CAutoEnumString::QueryInterface(const IID &iid, void **ppv) { if ( iid == IID_IUnknown ) { *ppv = (IEnumString *) this ; ((IEnumString *)(*ppv))->AddRef() ; } else if ( iid == IID_IEnumString ) { *ppv = (IEnumString *) this ; ((IEnumString *)(*ppv))->AddRef() ; } else { *ppv = NULL; return E_NOINTERFACE ; } return S_OK; } HRESULT CAutoEnumString::Next(ULONG celt, LPOLESTR *rgelt, ULONG *pceltFetched) { if (rgelt == NULL || (celt != 1 && pceltFetched == NULL)) return E_POINTER; if (m_iterCur == m_arString.GetSize()) return E_FAIL; ULONG nRem = (ULONG)(m_arString.GetSize() - m_iterCur); HRESULT hRes = S_OK; if (nRem < celt) hRes = S_FALSE; ULONG nMin = min(celt, nRem); if (pceltFetched != NULL) *pceltFetched = nMin; while(nMin--) { CString str = m_arString.GetAt(m_iterCur++); BSTR bstr = str.AllocSysString(); Copy(rgelt++, &bstr); } return hRes; } HRESULT CAutoEnumString::Copy(LPOLESTR* p1, LPOLESTR* p2) { HRESULT hr = S_OK; (*p1) = (LPOLESTR)CoTaskMemAlloc(sizeof(OLECHAR)*(ocslen(*p2)+1)); if (*p1 == NULL) hr = E_OUTOFMEMORY; else ocscpy(*p1,*p2); return hr; } HRESULT CAutoEnumString::Reset(void) { m_iterCur = 0; return S_OK; } HRESULT CAutoEnumString::Skip(ULONG celt) { if (m_arString.GetSize() - m_iterCur < (long)celt) { m_iterCur = m_arString.GetSize(); return S_FALSE; } m_iterCur += celt; return S_FALSE; } HRESULT CAutoEnumString::Clone(IEnumString** ppEnum) { HRESULT hRes = E_POINTER; if (ppEnum != NULL) { CAutoEnumString* p = NULL; p = new CAutoEnumString; if (p == NULL) { *ppEnum = NULL; hRes = E_OUTOFMEMORY; } else { for(int i=0;i<m_arString.GetSize();i++) p->AddString(m_arString.GetAt(i)); hRes = p->QueryInterface(IID_IEnumString, (void**)ppEnum); if (FAILED(hRes)) delete p; } } return hRes; }